]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
appMenu: Support launching on the non-default GPU
authorFlorian Müllner <fmuellner@gnome.org>
Wed, 11 Aug 2021 23:31:35 +0000 (01:31 +0200)
committerMarge Bot <marge-bot@gnome.org>
Mon, 16 Aug 2021 21:28:22 +0000 (21:28 +0000)
Changing the GPU to launch an app on is the last feature from the
app context menu that is still missing. Add support for it now,
and we are ready for some unifying cleanup!

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1948>

js/ui/appMenu.js

index a5011cc3120a3c2f19cb714f97e811e2a00a26a2..87d2218cdf354a7f3912cc03767beb2c7318d9cd 100644 (file)
@@ -60,6 +60,12 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
         this._actionSection = new PopupMenu.PopupMenuSection();
         this.addMenuItem(this._actionSection);
 
+        this._onGpuMenuItem = this.addAction('', () => {
+            this._animateLaunch();
+            this._app.launch(0, -1, this._getNonDefaultLaunchGpu());
+            Main.overview.hide();
+        });
+
         this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
 
         this._toggleFavoriteItem = this.addAction('', () => {
@@ -110,9 +116,14 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
             global.settings,
             global.settings.connect('writable-changed::favorite-apps',
                 () => this._updateFavoriteItem()),
+        ], [
+            global,
+            global.connect('notify::switcheroo-control',
+                () => this._updateGpuItem()),
         ]);
         this._updateQuitItem();
         this._updateFavoriteItem();
+        this._updateGpuItem();
         this._updateDetailsVisibility();
     }
 
@@ -122,6 +133,7 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
 
         this._updateQuitItem();
         this._updateNewWindowItem();
+        this._updateGpuItem();
     }
 
     _updateQuitItem() {
@@ -152,6 +164,24 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
             : _('Add to Favorites');
     }
 
+    _updateGpuItem() {
+        const proxy = global.get_switcheroo_control();
+        const hasDualGpu = proxy?.get_cached_property('HasDualGpu')?.unpack();
+
+        const showItem =
+            this._app?.state === Shell.AppState.STOPPED && hasDualGpu;
+
+        this._onGpuMenuItem.visible = showItem;
+
+        if (!showItem)
+            return;
+
+        const launchGpu = this._getNonDefaultLaunchGpu();
+        this._onGpuMenuItem.label.text = launchGpu === Shell.AppLaunchGpu.DEFAULT
+            ? _('Launch using Integrated Graphics Card')
+            : _('Launch using Discrete Graphics Card');
+    }
+
     _updateDetailsVisibility() {
         const sw = this._appSystem.lookup_app('org.gnome.Software.desktop');
         this._detailsItem.visible = sw !== null;
@@ -162,6 +192,12 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
             this.sourceActor.animateLaunch();
     }
 
+    _getNonDefaultLaunchGpu() {
+        return this._app.appInfo.get_boolean('PrefersNonDefaultGPU')
+            ? Shell.AppLaunchGpu.DEFAULT
+            : Shell.AppLaunchGpu.DISCRETE;
+    }
+
     /** */
     destroy() {
         super.destroy();
@@ -220,6 +256,7 @@ var AppMenu = class AppMenu extends PopupMenu.PopupMenu {
         this._updateQuitItem();
         this._updateNewWindowItem();
         this._updateFavoriteItem();
+        this._updateGpuItem();
     }
 
     _queueUpdateWindowsSection() {